/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mamesoft.namibiamc.beans;

import com.mamesoft.namibiamc.tools.JDBC;
import com.mamesoft.namibiamc.tools.Utility;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.ResultSet;
import hirondelle.date4j.DateTime;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.TimeZone;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author simone
 */
public class PazienteBean implements Serializable {

    private LoginBean loginBean;
    private int id = -1, idMedico = -1;
    private String nome = null;
    private String cognome = null, nomeMedico = null, cognomeMedico = null;
    private String sesso = null;
    private String dataNascita = null;
    private String foto = null;
    private String eta = null;
    private String longitudine = null;
    private String latitudine = null;
    private String luogoNascita = null;

    public List<PazienteBean> listPazienti() {
        try {
            ArrayList<PazienteBean> l = new ArrayList<PazienteBean>();
            Connection c = JDBC.connect();
            String q = "SELECT a2.ID,a2.nome,a2.cognome,a2.sesso,a2.data_nascita,foto FROM anagrafe AS a1"
                    + " JOIN paziente ON a1.id = medico"
                    + " JOIN anagrafe AS a2 ON a2.id = paziente.id"
                    + " WHERE medico = '" + getLoginBean().getId() + "'";
            ResultSet set = JDBC.executeQuery(q, c);
            while (set.next()) {
                PazienteBean pb = new PazienteBean();
                pb.setId(set.getInt("a2.ID"));
                pb.setNome(set.getString("nome"));
                pb.setCognome(set.getString("cognome"));
                pb.setSesso(set.getString("sesso"));
                Timestamp t = set.getTimestamp("data_nascita");
                DateTime f = new DateTime(t.toString());
                pb.setDataNascita(f.format("DD/MM/YYYY"));
                pb.setFoto(set.getString("foto"));
                DateTime today = DateTime.today(TimeZone.getDefault());
                int age = today.getYear() - f.getYear();
                if (today.getDayOfYear() < f.getDayOfYear()) {
                    age = age - 1;
                }
                pb.setEta(String.valueOf(age));
                l.add(pb);
            }
            set.close();
            c.close();
            return l;
        } catch (Exception ex) {
            Logger.getLogger(PazienteBean.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public void fetchCoordinate() {
        try {
            Connection c = JDBC.connect();
            List<String> coo = Utility.fetchCoordinate(luogoNascita);
            setLongitudine(coo.get(Utility.LONGITUDINE));
            setLatitudine(coo.get(Utility.LATITUDINE));
            String q = "UPDATE anagrafe set longitudine='" + coo.get(Utility.LONGITUDINE) + "' , latitudine='" + coo.get(Utility.LATITUDINE) + "' WHERE id = '" + id + "';";
            JDBC.executeStatement(q, c);
            c.close();
        } catch (Exception ex) {
            longitudine = null;
            latitudine = null;
        }
        
    }

    public List<PazienteBean> listAllPazienti() {
        try {
            ArrayList<PazienteBean> l = new ArrayList<PazienteBean>();
            Connection c = JDBC.connect();
            String q = "SELECT a1.ID,a1.nome,a1.cognome,a2.ID,a2.nome,a2.cognome,a2.sesso,a2.data_nascita,foto,a2.latitudine,a2.longitudine,a2.luogo_nascita FROM anagrafe AS a1"
                    + " JOIN paziente ON a1.id = medico"
                    + " JOIN anagrafe AS a2 ON a2.id = paziente.id";
            ResultSet set = JDBC.executeQuery(q, c);
            while (set.next()) {
                PazienteBean pb = new PazienteBean();
                pb.setId(set.getInt("a2.ID"));
                pb.setNome(set.getString("a2.nome"));
                pb.setCognome(set.getString("a2.cognome"));
                pb.setSesso(set.getString("a2.sesso"));
                Timestamp t = set.getTimestamp("a2.data_nascita");
                DateTime f = new DateTime(t.toString());
                pb.setDataNascita(f.format("DD/MM/YYYY"));
                pb.setFoto(set.getString("foto"));
                pb.setIdMedico(set.getInt("a1.ID"));
                pb.setNomeMedico(set.getString("a1.nome"));
                pb.setCognomeMedico(set.getString("a1.cognome"));
                pb.setLatitudine(set.getString("a2.latitudine"));
                pb.setLongitudine(set.getString("a2.longitudine"));
                pb.setLuogoNascita(set.getString("a2.luogo_nascita"));
                DateTime today = DateTime.today(TimeZone.getDefault());
                int age = today.getYear() - f.getYear();
                if (today.getDayOfYear() < f.getDayOfYear()) {
                    age = age - 1;
                }
                pb.setEta(String.valueOf(age));
                l.add(pb);
            }
            set.close();
            c.close();
            return l;
        } catch (Exception ex) {
            Logger.getLogger(PazienteBean.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    /**
     * @return the loginBean
     */
    public LoginBean getLoginBean() {
        return loginBean;
    }

    /**
     * @param loginBean the loginBean to set
     */
    public void setLoginBean(LoginBean loginBean) {
        this.loginBean = loginBean;
    }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @return the cognome
     */
    public String getCognome() {
        return cognome;
    }

    /**
     * @param cognome the cognome to set
     */
    public void setCognome(String cognome) {
        this.cognome = cognome;
    }

    /**
     * @return the sesso
     */
    public String getSesso() {
        return sesso;
    }

    /**
     * @param sesso the sesso to set
     */
    public void setSesso(String sesso) {
        this.sesso = sesso;
    }

    /**
     * @return the dataNascita
     */
    public String getDataNascita() {
        return dataNascita;
    }

    /**
     * @param dataNascita the dataNascita to set
     */
    public void setDataNascita(String dataNascita) {
        this.dataNascita = dataNascita;
    }

    /**
     * @return the foto
     */
    public String getFoto() {
        return foto;
    }

    /**
     * @param foto the foto to set
     */
    public void setFoto(String foto) {
        this.foto = foto;
    }

    /**
     * @return the eta
     */
    public String getEta() {
        return eta;
    }

    /**
     * @param eta the eta to set
     */
    public void setEta(String eta) {
        this.eta = eta;
    }

    /**
     * @return the idMedico
     */
    public int getIdMedico() {
        return idMedico;
    }

    /**
     * @param idMedico the idMedico to set
     */
    public void setIdMedico(int idMedico) {
        this.idMedico = idMedico;
    }

    /**
     * @return the nomeMedico
     */
    public String getNomeMedico() {
        return nomeMedico;
    }

    /**
     * @param nomeMedico the nomeMedico to set
     */
    public void setNomeMedico(String nomeMedico) {
        this.nomeMedico = nomeMedico;
    }

    /**
     * @return the cognomeMedico
     */
    public String getCognomeMedico() {
        return cognomeMedico;
    }

    /**
     * @param cognomeMedico the cognomeMedico to set
     */
    public void setCognomeMedico(String cognomeMedico) {
        this.cognomeMedico = cognomeMedico;
    }

    /**
     * @return the longitudine
     */
    public String getLongitudine() {
        return longitudine;
    }

    /**
     * @param longitudine the longitudine to set
     */
    public void setLongitudine(String longitudine) {
        this.longitudine = longitudine;
    }

    /**
     * @return the latitudine
     */
    public String getLatitudine() {
        return latitudine;
    }

    /**
     * @param latitudine the latitudine to set
     */
    public void setLatitudine(String latitudine) {
        this.latitudine = latitudine;
    }

    public boolean isFetchButtonDisabled() {
        return !(longitudine == null || latitudine == null);
    }

    /**
     * @return the luogoNascita
     */
    public String getLuogoNascita() {
        return luogoNascita;
    }

    /**
     * @param luogoNascita the luogoNascita to set
     */
    public void setLuogoNascita(String luogoNascita) {
        this.luogoNascita = luogoNascita;
    }
}